#include <iostream>
using namespace std;

// class date
// {
// public:
//     date(int year = 2024, int month = 12, int day = 1)
//     {
//         _year = year;
//         _month = month;
//         _day = day;
//     }
//     bool operator<(const date& x1) const
//     {
//         if (_year < x1._year)
//         {
//             return true;
//         }
//         else if (_year == x1._year && _month < x1._month)
//         {
//             return true;
//         }
//         else if (_year == x1._year && _month == x1._month && _day < x1._day)
//         {
//             return true;
//         }
//         return false;
//     }
//
//     bool operator>(const date& x1) const
//     {
//         if (_year > x1._year)
//         {
//             return true;
//         }
//         else if (_year == x1._year && _month > x1._month)
//         {
//             return true;
//         }
//         else if (_year == x1._year && _month == x1._month && _day > x1._day)
//         {
//             return true;
//         }
//         return false;
//     }
// private:
//     int _year;
//     int _month;
//     int _day;
// };
//
// class date
// {
// public:
//     date(int year = 2024, int month = 12, int day = 1)
//     {
//         _year = year;
//         _month = month;
//         _day = day;
//     }
//
//     date (const date& d)
//     {
//         _year = d._year;
//         _month = d._month;
//         _day = d._day;
//     }
//
//     date& operator= (const date& d)
//     {
//         _year = d._year;
//         _month = d._month;
//         _day = d._day;
//
//         return *this;
//     }
//
// private:
//     int _year;
//     int _month;
//     int _day;
// };

// class Time
// {
// public:
//     Time()
//     {
//         _hour = 1;
//         _minute = 1;
//         _second = 1;
//     }
//
//     Time& operator=(const Time& t)
//     {
//         if (this != &t)
//         {
//             _hour = t._hour;
//             _minute = t._minute;
//             _second = t._second;
//         }
//         return *this;
//     }
// private:
//     int _hour;
//     int _minute;
//     int _second;
// };
//
// class date
// {
// private:
//     int _year = 2024;
//     int _month = 12;
//     int _day = 1;
//
//     Time _t;
// };

// typedef int datetype;
// class stack
// {
// public:
//     stack(size_t capacity = 10)
//     {
//         _arr = (datetype*)malloc(capacity * sizeof(datetype));
//         if (nullptr == _arr)
//         {
//             perror("malloc fail");
//             return;
//         }
//
//         _size = 0;
//         _capacity = capacity;
//     }
//
//     void push(const datetype& data)
//     {
//         _arr[_size] = data;
//         _size++;
//     }
//
//     ~stack()
//     {
//         if(_arr)
//         {
//             free(_arr);
//             _arr = nullptr;
//             _capacity = 0;
//             _size = 0;
//         }
//     }
// private:
//     datetype *_arr;
//     size_t _size;
//     size_t _capacity;
// };


// class date
// {
// public:
//     date(int year = 2024, int month = 12, int day = 1)
//     {
//         _year = year;
//         _month = month;
//         _day = day;
//     }
//
//     date& operator++ ()
//     {
//         _day += 1;
//         return *this;
//     }
//
//     date operator++ (int)
//     {
//         date temp(*this);
//         _day += 1;
//         return temp;
//     }
//
//     void print() const
//     {
//         cout << _year << "-" << _month << "-" << _day << endl;
//     }
//
// private:
//     int _year;
//     int _month;
//     int _day;
// };
//
// int main()
// {
//     date d;
//     date d1(2024,12,2);
//
//     cout << "d: ";
//     d.print();
//     cout << "d1: ";
//     d1.print();
//
//     d = d1++;
//     cout << "\nAfter d = d1++:" << endl;
//     cout << "d: ";
//     d.print();
//     cout << "d1: ";
//     d1.print();
//
//     d = ++d1;
//     cout << "\nAfter d = ++d1:" << endl;
//     cout << "d: ";
//     d.print();
//     cout << "d1: ";
//     d1.print();
//
//     return 0;
// }

class date
{
public:
    static int GetMonthDay(int year, int month)
    {
        static int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
        int day = days[month];
        if(month==2
            &&((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)))
        {
            day += 1;
        }
        return day;
    }

    explicit date(int year = 2024, int month = 12, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    date(const date& d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }

    date& operator=(const date& d)
    {
        if(this != &d)
        {
            _year = d._year;
            _month = d._month;
            _day = d._day;
        }
        return *this;
    }

    date& operator+=(int day)
    {
        _day += day;
        while (_day > GetMonthDay(_year,_month))
        {
            _day -= GetMonthDay(_year,_month);
            ++_month;
            if(_month == 13)
            {
                ++_year;
                _month = 1;
            }
        }
        return *this;
    }

    date operator+(int day)
    {
        date tmp = *this;
        tmp += day;
        return tmp;
    }

    date& operator-=(int day)
    {
        _day -= day;
        while(_day <= 0)
        {
            --_month;
            if(_month == 0)
            {
                _month = 12;
                --_year;
            }
            _day += GetMonthDay(_year, _month);
        }
        return *this;
    }

    date operator-(int day)
    {
        date tmp = *this;
        tmp -= day;
        return tmp;
    }

    date& operator++()
    {
        *this += 1;//会自动使用 this 指向的当前对象的 _day 成员变量。你无需显式传递 _day，因为成员函数默认操作当前对象的成员变量
        return *this;
    }

    date operator++(int)
    {
        date tmp = *this;
        *this += 1;

        return tmp;
    }

    date& operator--()
    {
        *this += 1;
        return *this;
    }

    date operator--(int)
    {
        date tmp = *this;
        *this -= 1;
        return tmp;
    }

    bool operator<(const date& d) const
    {
        if (_year < d._year)
        {
            return true;
        }
        else if (_year == d._year && _month < d._month)
        {
            return true;
        }
        else if (_year == d._year && _month == d._month && _day < d._day)
        {
            return true;
        }
        return false;
    }

    bool operator>(const date& d) const
    {
        return !(*this <= d);
    }

    bool operator<=(const date& d) const
    {
        return *this < d || *this == d;
    }

    bool operator>=(const date& d) const
    {
        return *this > d || *this == d;
    }

    bool operator==(const date& d) const
    {
        return _year == d._year
            && _month == d._month
            && _day == d._day;
    }

    bool operator!=(const date& d) const
    {
        return !(*this == d);
    }

    int operator-(const date& d)
    {
        date max = *this;
        date min = d;
        int flag = 1;

        if(*this < d)
        {
            max = d;
            min = *this;
            flag = -1;
        }
        int n = 0;
        while (min != max)
        {
            ++min;
            ++n;
        }
        return n*flag;
    }

    void print() const
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }

private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    date d1;
    date d2(2024,12,12);
    d1.print();

    cout << d2 - d1 << endl;
    cout << d1 - d2 << endl;

    // d1++;
    // d1.print();
    //
    // // d1+1;
    // // d1.print();
    // // (d1+1).print();
    // //
    // // d1+=1;
    // // d1.print();

    return 0;
}